ICEI is a binary snow/ice cover index derived from the Normalized Difference Snow Index (NDSI),
used to map the presence or absence of snow and ice over large areas with optical satellite data.
1. Concept & Formula
The Ice Cover Extent Index (ICEI) is designed to identify
and map snow or ice-covered surfaces from multispectral satellite imagery.
A common approach is to first compute the NDSI using
a Green and SWIR band, then apply a threshold to obtain a binary mask
of snow/ice presence.
Where T is a threshold (often between 0.3–0.5)
depending on the sensor, region, and atmospheric conditions.
Typical Interpretation
ICEI Value
Interpretation
0
No snow/ice (bare soil, water, vegetation, urban surfaces)
1
Snow or ice-covered pixels (high NDSI response)
Main Applications
Snow cover mapping and monitoring
Glacier and ice-sheet extent analysis
Hydrological modeling and runoff estimation
Climate and cryosphere studies
2. Data & Bands for ICEI
Common Sensors & Bands
Sentinel-2 (ESA) – 10–20 m
Green: B3 (~560 nm)
SWIR: B11 (~1610 nm) or B12 (~2190 nm)
Landsat 8/9 OLI – 30 m
Green: B3
SWIR: B6 or B7
Good Practice
Use surface reflectance products with atmospheric correction.
Mask clouds and cloud shadows before computing NDSI/ICEI.
Adjust the threshold T for specific regions
and seasons using reference data or visual inspection.
Combine with elevation or temperature data to refine snow/ice mapping.
Limitations
Bright non-snow features (e.g., salt pans, some clouds) may be misclassified.
Forest canopies with snow beneath may reduce the apparent NDSI signal.
Requires clear-sky conditions for optical sensors.
3. Google Earth Engine Code – ICEI for Any AOI
Steps: open code.earthengine.google.com → New Script → paste the code →
draw your AOI as geometry on the map → click Run.
Then export ICEI as GeoTIFF to Google Drive.
// ICEI – Ice Cover Extent Index using Sentinel-2 SR
// -------------------------------------------------
// This script computes NDSI and then a binary ICEI mask for any AOI.
//
// 1) Go to: https://code.earthengine.google.com
// 2) Click "New Script" and paste this code.
// 3) On the map: draw your AOI (Polygon/Rectangle).
// It will appear as a variable named 'geometry' in the left panel.
// 4) Click "Run" to display ICEI.
// 5) In the Tasks tab, click "Run" to export ICEI to Google Drive.
// -------------------------------------------------------
// 1. Define Area of Interest (AOI)
// -------------------------------------------------------
var roi = geometry; // Make sure a 'geometry' object exists in the left panel
// Center the map on the AOI
Map.centerObject(roi, 8);
// -------------------------------------------------------
// 2. Define date range and basic parameters
// -------------------------------------------------------
var startDate = '2023-01-01';
var endDate = '2023-12-31';
// NDSI threshold to create binary ICEI mask
var ndsiThreshold = 0.4; // adjust 0.3–0.5 if needed
// -------------------------------------------------------
// 3. Load Sentinel-2 SR data and pre-process
// -------------------------------------------------------
var s2_sr = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30));
// Simple cloud mask using QA band (SCL)
function maskS2clouds(img) {
var scl = img.select('SCL');
// Keep only non-cloud classes (e.g. 1:SATURATED/DEFECTIVE, 2:DARK_AREA, 4:VEGETATION,
// 5:NOT_VEGETATED, 6:WATER, 7:UNCLASSIFIED, 11:SNOW/ICE)
var mask = scl.eq(2)
.or(scl.eq(4))
.or(scl.eq(5))
.or(scl.eq(6))
.or(scl.eq(7))
.or(scl.eq(11));
return img.updateMask(mask);
}
var s2_clean = s2_sr.map(maskS2clouds);
// Create a median composite
var composite = s2_clean.median().clip(roi);
// -------------------------------------------------------
// 4. Compute NDSI and ICEI
// -------------------------------------------------------
// Green: B3 (~560 nm)
// SWIR: B11 (~1610 nm) - you may also test B12 (~2190 nm)
var green = composite.select('B3');
var swir = composite.select('B11');
// NDSI
var ndsi = green.subtract(swir)
.divide(green.add(swir))
.rename('NDSI');
// ICEI: binary mask (1 = snow/ice, 0 = no snow/ice)
var icei = ndsi.gt(ndsiThreshold).rename('ICEI');
// -------------------------------------------------------
// 5. Visualization
// -------------------------------------------------------
var ndsiVis = {
min: -1.0,
max: 1.0,
palette: [
'#1d3557', // low
'#457b9d',
'#a8dadc',
'#f1faee',
'#ffffff' // high NDSI
]
};
// Binary ICEI palette: 0 = dark, 1 = bright cyan
var iceiVis = {
min: 0,
max: 1,
palette: ['#0b1020', '#00e5ff']
};
// Add NDSI and ICEI layers
Map.addLayer(ndsi, ndsiVis, 'NDSI (Sentinel-2)', false);
Map.addLayer(icei, iceiVis, 'ICEI (Snow/Ice Mask)', true);
// Optional: true color for context
var s2_rgb = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30))
.select(['B4','B3','B2']) // RGB
.median()
.clip(roi);
Map.addLayer(s2_rgb, {min: 0, max: 3000}, 'True Color (RGB)', false);
// -------------------------------------------------------
// 6. Export ICEI as GeoTIFF to Google Drive
// -------------------------------------------------------
Export.image.toDrive({
image: icei,
description: 'ICEI_Export',
fileNamePrefix: 'ICEI_Export',
folder: 'EarthEngine_Exports', // you can change the folder name
region: roi,
scale: 20, // Sentinel-2 resolution (10 or 20 m)
crs: 'EPSG:4326',
maxPixels: 1e13
});